#include "list.h"

/********************************** 登录 **********************************/
// 学生登录
bool Student_log_in(list_str *L, int *index)
{
    printf("欢迎来到学生登录界面\n");
    // 声明两个字符串
    char user[128];
    char pass[128];
    int count = 3;
    while (1)
    {

        // 清空字符串
        memset(user, 0, sizeof(user));
        memset(pass, 0, sizeof(pass));
        // 用户输入
        printf("请输入账号");
        scanf("%s", user);
        printf("请输入密码");
        scanf("%s", pass);
        // 循环判定
        for (size_t i = 0; i < L->len; i++)
        {
            if (!strcmp(user, L->data[i].user_name))
            {
                if (!strcmp(pass, L->data[i].password))
                {
                    *index = i;
                    return true;
                }
            }
        }
        printf("输入错误,你还有%d次机会\n",count);
        count--;
        if (count<0)
        {
            return false;
        }
    }
}

// 老师登录
bool Teacher_log_in(list_str *L)
{
    printf("欢迎来到老师登录界面\n");
    // 声明两个字符串
    char user[128];
    char pass[128];
    int count = 3;
    while (1)
    {
        // 清空字符串
        memset(user, 0, sizeof(user));
        memset(pass, 0, sizeof(pass));
        // 用户输入
        printf("请输入账号");
        scanf("%s", user);
        printf("请输入密码");
        scanf("%s", pass);
        // 循环判定
        for (size_t i = 0; i < L->len; i++)
        {
            if (!strcmp(user, L->data[i].user_name))
            {
                if (!strcmp(pass, L->data[i].password))
                {
                    return true;
                }
            }
        }
        printf("输入错误,你还有%d次机会\n",count);
        count--;
        if (count<0)
        {
            return false;
        }
        
    }
}

// 初始化
void list_init(list_str **L)
{
    // 创建动态内存
    (*L) = (list_str *)malloc(sizeof(list_str));
    if (NULL == (*L))
    {
        printf("创建失败\n");
        exit(-1);
    }

    // 初始化数据
    (*L)->len = 0;

    return;
}

// 增
bool list_add(list_str *L, stu_user data)
{
    // 判定是否为空
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    // 是否越界
    if (MAX_LEN <= L->len)
    {
        printf("学生已经满了\n");
        return false;
    }

    // 插入操作
    L->data[L->len] = data;

    // 迭代长度
    L->len++;
}

// 删
bool list_del(list_str *L)
{
    // 判定是否为空
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    // 是否没有学生了
    if (-1 >= L->len)
    {
        printf("学生已经满了\n");
        return false;
    }

    // 删除尾部学生
    --L->len;
}


//从终端获取学生信息
stu_user list_get(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    stu_user new_student;
    
    printf("请输入学生账号: ");
    scanf("%s", new_student.user_name);
    printf("请输入学生密码: ");
    scanf("%s", new_student.password);
    printf("请输入学生姓名: ");
    scanf("%s", new_student.name);
    printf("请输入学生性别: ");
    scanf("%s", new_student.sex);
    printf("请输入学生id: ");
    scanf(" %d", &new_student.id);
    printf("请输入学生年龄: ");
    scanf("%d", &new_student.age);
    printf("请输入学生成绩: ");
    scanf("%d", &new_student.soc);
    return new_student;
}

//老师查
int list_Teacher_find(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    char name_str[128];
    int id_str = 0;

    printf("请输入要修改的学生姓名:");
    scanf("%s", name_str);
    printf("请输入要修改的学生学号:");
    scanf(" %d", &id_str);
    for (size_t i = 0; i < L->len; i++)
    {
        if( strcmp(name_str,L->data[i].name)==0 && L->data[i].id == id_str)
        {
            return i;
        }
        
    }
    
    return -1;        
        

}
// 老师改  姓名....
bool list_Teacher_alter(list_str *L, int index)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
   
    stu_user *target = &L->data[index];
    printf( "%s\t%s\t%s\t%s\t%d\t%d\t%d\n" , \
        target->user_name , target->password , \
        target->name , target->sex , target->id , \
        target->age  , target->soc
    );
    stu_user new_student;
    
    printf("请输入学生账号: ");
    scanf("%s", L->data[index].user_name);
    printf("请输入学生密码: ");
    scanf("%s", L->data[index].password);
    printf("请输入学生姓名: ");
    scanf("%s", L->data[index].name);
    printf("请输入学生性别: ");
    scanf("%s", L->data[index].sex);
    printf("请输入学生id: ");
    scanf(" %d", &L->data[index].id);
    printf("请输入学生年龄: ");
    scanf("%d", &L->data[index].age);
    printf("请输入学生成绩: ");
    scanf("%d", &L->data[index].soc);

}

// 老师加
bool list_Teacher_add(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    printf("接下来增加一个学生信息\n");
    list_add(L,list_get(L));
    system("clear");
}

//老师删
bool list_Teacher_del(list_str * L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    printf("接下来删除末尾的学生信息\n");
    list_del(L);
}

//判断删
bool list_Teacher_ifdel(list_str * L)
{
    char c;
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    system("clear");
    printf("您是否要删除以下学生数据(y/n):\n");
    printf( "%s\t%s\t%s\t%s\t%d\t%d\t%d\n" , \
        L->data[L->len-1].user_name , L->data[L->len-1].password , \
        L->data[L->len-1].name , L->data[L->len-1].sex , L->data[L->len-1].id , \
        L->data[L->len-1].age  , L->data[L->len-1].soc
    );
    while (1)
    {
        while (getchar() != '\n');
        scanf("%c",&c);
        if (c == 'n')
        {
            return false;
        }
        if (c == 'y')
        {
            return true;
        }
        if(c!='n'||c!='y'){
            printf("输入错误，请重新输入:");
        }
        
    }
}
    

// 学生查  查自己
bool list_Student_find(list_str *L, stu_user data)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    system("clear");
    printf("账号\t密码\t姓名\t性别\t学号\t年龄\t成绩\n");
    printf( "%s\t%s\t%s\t%s\t%d\t%d\t%d\n" , \
        data.user_name , data.password , \
        data.name , data.sex , data.id , \
        data.age  , data.soc
    );
    exit_();
}

// 成绩排序
bool list_sort(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    for (int i = 0; i <  L->len - 1; i++) {
        for (int j = 0; j < L->len - i - 1; j++) {
            if (L->data[j].soc < L->data[j + 1].soc) {
                // 交换学生信息
                stu_user temp = L->data[j];
                L->data[j] = L->data[j+1];
                L->data[j+1] = temp;
            }
        }
    }
    system("clear");
}

// 遍历程序
void list_printf(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    printf("账号\t密码\t姓名\t性别\t学号\t年龄\t成绩\n");
    for (size_t i = 0; i < L->len; i++)
    {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
               L->data[i].user_name, L->data[i].password,
               L->data[i].name, L->data[i].sex, L->data[i].id,
               L->data[i].age, L->data[i].soc);
    }
}


// 释放顺序表
void list_free(list_str **L)
{
    // 检查指针有效性
    if (L == NULL || *L == NULL) 
    {
        printf("空指针释放失败");
        return;
    }

    for (int i = 0; i < (*L)->len; i++) {

        free((*L)->data[i].user_name);
        
    }

    free(*L);
    *L = NULL;
        
}

//退出函数
void exit_(){
    char input;
    printf("\n\n按回车键返回上级目录" );
    while (getchar() != '\n');
    while (1) {
        input = getchar();
        if (input == '\n') {
            printf("正在退出中...\n");
            sleep(0.2);
            system("clear");
            break;
        }
    }
}

//乘法表
void multiplication_table()
{   
    system("clear");
    for (int i = 1; i <= 9; i++)
    {
        // 内层循环控制列数（1 到 i）
        for (int j = 1; j <= i; j++)
        {
            // 打印乘法表达式和结果
            printf("%d*%d=%-2d  ", j, i, i * j);
        }
        // 换行
        printf("\n");
    }
    exit_();
}

void guess_number()
{
    system("clear"); // 清屏
    srand(time(NULL));
    unsigned int val = rand() % 100; // 生成 0~99 的随机数

    int temp = 0;
    int maxtemp = 100;
    int mintemp = 0;
    
    printf("来玩猜数字,不玩了请输入520\n\n");
    

    while (1)
    {
        printf("请输入一个数字(%d~%d):", mintemp, maxtemp);
        int result = scanf("%d", &temp); // 读取用户输入

        // 检查输入是否有效
        if (result != 1)
        {
            printf("输入无效，请输入数字！\n");
            while (getchar() != '\n'); // 清除输入缓冲区
            continue; // 跳过本次循环
        }

        // 检查是否退出
        if (temp == 520)
        {
            printf("\n正在退出\n");
            break;
        }

        // 检查输入是否在合法范围内
        if (temp <= mintemp || temp >= maxtemp)
        {
            printf("输入错误,应输入%d~%d之间的数\n", mintemp, maxtemp);
            continue;
        }

        // 判断用户输入与目标值的关系
        if (temp > val)
        {
            maxtemp = temp;
            printf("数字大了,应在%d~%d之间\n", mintemp, maxtemp);
        }
        else if (temp < val)
        {
            mintemp = temp;
            printf("数字小了,应在%d~%d之间\n", mintemp, maxtemp);
        }
        else
        {
            printf("恭喜答对~\n");
            break;
        }
    }

    exit_(); // 退出函数
}

void calculator()
{
    system("clear");
    float num1, num2;
    char operator;

    // 输入两个数字和运算符
    printf("请输入第一个数字: ");
    scanf("%f", &num1);
    printf("请输入运算符 (+, -, *, /): ");
    scanf(" %c", &operator); // 注意空格，避免读取换行符
    printf("请输入第二个数字: ");
    scanf("%f", &num2);

    float result;
    switch (operator)
    {
    case '+':
        result = num1 + num2;
        printf("%.2f + %.2f = %.2f\n", num1, num2, result);
        break;
    case '-':
        result = num1 - num2;
        printf("%.2f - %.2f = %.2f\n", num1, num2, result);
        break;
    case '*':
        result = num1 * num2;
        printf("%.2f * %.2f = %.2f\n", num1, num2, result);
        break;
    case '/':
        if (num2 != 0) // 检查除数是否为 0
        {
            result = num1 / num2;
            printf("%.2f / %.2f = %.2f\n", num1, num2, result);
        }
        else
        {
            printf("错误：除数不能为 0！\n");
        }
        break;
    default:
        printf("错误：无效的运算符！\n");
        break;
    }
    exit_();
}